package com.nidu.demo.redis.service;

import java.util.List;
import java.util.Map;
import java.util.Set;
import java.util.concurrent.TimeUnit;

/**
 * Redis服务接口
 * 提供通用的Redis操作方法
 *
 * @author nidu
 */
public interface RedisService {

    // ========== String 操作 ==========

    /**
     * 设置值
     */
    void set(String key, Object value);

    /**
     * 设置值（带过期时间）
     */
    void set(String key, Object value, long timeout, TimeUnit unit);

    /**
     * 获取值
     */
    Object get(String key);

    /**
     * 获取值（带类型转换）
     */
    <T> T get(String key, Class<T> type);

    /**
     * 删除键
     */
    Boolean delete(String key);

    /**
     * 批量删除键
     */
    Long delete(String... keys);

    /**
     * 检查键是否存在
     */
    Boolean hasKey(String key);

    /**
     * 设置过期时间
     */
    Boolean expire(String key, long timeout, TimeUnit unit);

    /**
     * 获取剩余过期时间
     */
    Long getExpire(String key, TimeUnit unit);

    // ========== Hash 操作 ==========

    /**
     * Hash设置值
     */
    void hSet(String key, String field, Object value);

    /**
     * Hash获取值
     */
    Object hGet(String key, String field);

    /**
     * Hash获取所有值
     */
    Map<Object, Object> hGetAll(String key);

    /**
     * Hash删除字段
     */
    Long hDelete(String key, Object... fields);

    /**
     * Hash是否存在字段
     */
    Boolean hHasKey(String key, String field);

    // ========== List 操作 ==========

    /**
     * List左推入
     */
    Long lLeftPush(String key, Object value);

    /**
     * List右推入
     */
    Long lRightPush(String key, Object value);

    /**
     * List左弹出
     */
    Object lLeftPop(String key);

    /**
     * List右弹出
     */
    Object lRightPop(String key);

    /**
     * List获取范围
     */
    List<Object> lRange(String key, long start, long end);

    /**
     * List获取长度
     */
    Long lSize(String key);

    // ========== Set 操作 ==========

    /**
     * Set添加
     */
    Long sAdd(String key, Object... values);

    /**
     * Set移除
     */
    Long sRemove(String key, Object... values);

    /**
     * Set是否包含
     */
    Boolean sIsMember(String key, Object value);

    /**
     * Set获取所有成员
     */
    Set<Object> sMembers(String key);

    /**
     * Set获取大小
     */
    Long sSize(String key);

    // ========== ZSet 操作 ==========

    /**
     * ZSet添加
     */
    Boolean zAdd(String key, Object value, double score);

    /**
     * ZSet移除
     */
    Long zRemove(String key, Object... values);

    /**
     * ZSet获取范围
     */
    Set<Object> zRange(String key, long start, long end);

    /**
     * ZSet获取大小
     */
    Long zSize(String key);

    /**
     * ZSet获取分数
     */
    Double zScore(String key, Object value);
}
